package com.itheima.pageprocessor;

import java.util.List;

import org.apache.commons.lang3.StringUtils;

import com.itheima.pipeline.DBPipeline;

import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.Spider;
import us.codecraft.webmagic.pipeline.ConsolePipeline;
import us.codecraft.webmagic.pipeline.FilePipeline;
import us.codecraft.webmagic.pipeline.JsonFilePipeline;
import us.codecraft.webmagic.processor.PageProcessor;
import us.codecraft.webmagic.scheduler.FileCacheQueueScheduler;
import us.codecraft.webmagic.scheduler.QueueScheduler;
import us.codecraft.webmagic.scheduler.RedisPriorityScheduler;

/**
 * 页面处理器
 * @author Johnny.Chen
 *
 */
public class MyPageProcessor implements PageProcessor{
	
	private Site site = Site.me()
			.setRetryTimes(1)     //重试
			.setSleepTime(1000)	  //休眠时间
			.setTimeOut(10000);   //超时时间

	/**
	 * 页面处理
	 */
	@Override
	public void process(Page page) {
		
		//1、获取整个页面的内容：
		//System.out.println("获取整个页面内容："+page.getHtml().toString());
		
		//2、使用xpath表达式过滤内容： 获取页面的内容
		//System.out.println(page.getHtml().xpath("//*[@id=\"mainScreen\"]/div/div/div/div[1]/div[2]/a[6]").toString());
		//System.out.println(page.getHtml().xpath("//*[@id=\"mainScreen\"]/div/div/div/div[1]/div[2]/a[6]/text()").toString());
		
		
		//3、使用正则表达式获取有用的链接
		//System.out.println("获取所有连接："+page.getHtml().links().all());
		List<String> link1 = page.getHtml().regex("https://my.oschina.net/u/[0-9]{3,8}/blog/[0-9]{3,8}").all();
		List<String> link2 = page.getHtml().regex("https://my.oschina.net/[a-zA0-9_-]{2,20}/blog/[0-9]{3,8}").all();
		link1.addAll(link2);
		//System.out.println(link1);
		//递归爬取： 一直爬取到没有为止
		page.addTargetRequests(link1);
		
		
		//======================================================================================================================
		//======================================================================================================================
		//======================================================================================================================
		String title = page.getHtml().xpath("//*[@id=\"mainScreen\"]/div/div/div/div[2]/div[1]/div[2]/h2/text()").toString();
		//把url往下传递
		if(StringUtils.isNotBlank(title)) {
			page.putField("title", title.trim());
		}else {
			//如果为空，跳过采集
			page.setSkip(true);
		}
		
		
	}

	/**
	 * 站点信息：休眠时间、重试次数等
	 */
	@Override
	public Site getSite() {
		return site;
	}
	
	
	public static void main(String[] args) {
		Spider.create(new MyPageProcessor()) //传入页面处理器
			  .addUrl("https://www.oschina.net/blog")  //爬取页面的入口：  给Downloader使用的
			  .addPipeline(new ConsolePipeline())  //添加持久化策略： Pipeline使用
			  .addPipeline(new FilePipeline("D:\\00_class\\112\\webmagic\\filepipeline"))//持久化到文件中
			  .addPipeline(new JsonFilePipeline("D:\\00_class\\112\\webmagic\\jsonpipeline")) //持久化到json中
			  .addPipeline(new DBPipeline())//自定义pipeline
			  //.setScheduler(new QueueScheduler())  //内存队列
			  //.setScheduler(new FileCacheQueueScheduler("D:\\00_class\\112\\webmagic\\fileSchulder")) //不适用于分布式系统
			  .setScheduler(new RedisPriorityScheduler("192.168.207.111"))  //以后用这种：适合分布式系统
			  .start();
	}
	
}
